/*
 * lanzador.cpp
 *
 *  Created on: 12/07/2014
 *      Author: migue
 */

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "../defines.h"

using namespace std;

void lanzarParque() {

	stringstream ssNum, ssLugar;


	int pid;

	cout << "Lanzando Salas ..." << endl;

	// lanzando Puertas
	for (int i = 0; i < CANT_ENTRADAS; ++i) {
		ssNum << (i+1);

		pid = fork();

		if (pid == 0) {
			execlp("./entrada", "PuertaEntrada", ssNum.str().c_str(), NULL);
			perror("No se pudo iniciar proceso Puerta de Entrada");
			exit(EXIT_FAILURE);
		}

		pid = fork();

		if (pid == 0) {
			execlp("./salida", "PuertaSalida", ssNum.str().c_str(), NULL);
			perror("No se pudo iniciar proceso Puerta de Entrada");
			exit(EXIT_FAILURE);
		}

		ssNum.str("");
	}

	cout << "Lanzando Salas ..." << endl;

	//lanzando Salas
	for (int i = 0; i < CANT_ENTRADAS; ++i) {
		ssNum << (i+1);
		ssLugar << (int) Tipos::LUGAR_ENTRADA;

		//lanzado sala de Entrada

		pid = fork();
		if (pid == 0) {
			execlp("./entradaSala", "EntradaSalaEnt", ssNum.str().c_str(), ssLugar.str().c_str(), NULL);
			perror("No se pudo iniciar proceso de EntradaSala en la Entrada");
			exit(EXIT_FAILURE);
		}

		pid = fork();
		if (pid == 0) {
			execlp("./salidaSala", "SalidaSalaEnt", ssNum.str().c_str(), ssLugar.str().c_str(), NULL);
			perror("No se pudo iniciar proceso de SalidaSala en la Salida");
			exit(EXIT_FAILURE);
		}

		ssLugar.str("");
		ssLugar << (int) Tipos::LUGAR_ZOO;

		//lanzando sala de Salida
		pid = fork();
		if (pid == 0) {
			execlp("./entradaSala", "EntradaSalaZoo", ssNum.str().c_str(), ssLugar.str().c_str(), NULL);
			perror("No se pudo iniciar proceso EntradaSala de Zoo");
			exit(EXIT_FAILURE);
		}

		pid = fork();
		if (pid == 0) {
			execlp("./salidaSala", "SalidaSalaZoo", ssNum.str().c_str(), ssLugar.str().c_str(), NULL);
			perror("No se pudo iniciar proceso SalidaSala de Zoo");
			exit(EXIT_FAILURE);
		}


		ssLugar.str("");
		ssNum.str("");
	}


	cout << "Lanzando Buses..." << endl;

	// Lanzando BUSES
	for (int i = 0; i < CANT_ENTRADAS; ++i) {

		ssNum << (i+1);

		pid = fork();
		if (pid == 0) {
			execlp("./bus", "BUS", ssNum.str().c_str(), NULL);
			perror("No se pudo iniciar proceso De BUS");
			exit(EXIT_FAILURE);
		}

		ssNum.str("");
	}


	//lanzando BUSES de repuesto
	for (int i = 0; i < CANT_BUSES_REPUESTO; ++i) {

		pid = fork();
		if (pid == 0) {
			execlp("./bus", "BUS", NULL);
			perror("No se pudo iniciar proceso De BUS de Repuesto");
			exit(EXIT_FAILURE);
		}
	}

	cout << "Parque lanzado" << endl;
}


int main(int argc, char** argv) {

	lanzarParque();


	return 0;
}
